﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TogheterWeBuyIt.Models;

namespace TogheterWeBuyIt.Controllers
{
    public class PromocaoController : Controller
    {
		PromocaoRepository _PromoRep = new PromocaoRepository();
		ProdutosRepository _ProdRep = new ProdutosRepository();
        //
        // GET: /Promocao/

        public ActionResult Index()
        {
            return View(_PromoRep.GetPromocoes());
        }

		[HttpPost]
		public ActionResult Index(FormCollection coll)
		{
			string busca = coll["TxbBusca"];
			return View(_PromoRep.GetPromocoes(busca));
		}

        //
        // GET: /Promocao/Details/5

        public ActionResult Details(int id)
        {
            return View(_PromoRep.GetPromocao(id));
        }

		public ActionResult Participate(int id)
		{
			if (Session["LoggedUserId"] != null)
			{
				_PromoRep.AddParticipaPromocao(new ParticipaPromocao() { IdPromocao = id, IdUsuario = (int)Session["LoggedUserId"] });
				return RedirectToAction("Details", new { id = id });
			}
			else
				return RedirectToAction("LogIn", "Usuario");
		}

        //
        // GET: /Promocao/Create

		public ActionResult Create(int? id)
		{
			IQueryable<Produto> produtos = _ProdRep.FindAllProdutos();
			
			if (Request.IsAjaxRequest())
				return PartialView("Controls/UProductsList", produtos);
			else
				return View(new CreatePromocaoModel() { Produtos = produtos, Promocao = new Promocao() });
		}

        //
        // POST: /Promocao/Create

        [HttpPost]
        public ActionResult Create(int? id, ETipoProduto? tipoProd, FormCollection collection)
        {
			if (!Request.IsAjaxRequest())
			{
				if (Session["LoggedUserId"] != null)
				{
					DateTime dtInicio = DateTime.MinValue;
					DateTime dtFim = DateTime.MinValue;

					DateTime.TryParse(collection["Promocao.DataInicioValidade"], out dtInicio);
					DateTime.TryParse(collection["Promocao.DataFimValidade"], out dtFim);

					DateTime? realDtInicio = null;
					DateTime? realDtFim = null;

					if (!dtInicio.Equals(DateTime.MinValue))
						realDtInicio = dtInicio;

					if (!dtFim.Equals(DateTime.MinValue))
						realDtFim = dtFim;

					int clientesMin = -1;
					int clientesMax = -1;

					int.TryParse(collection["Promocao.ClientesMin"], out clientesMin);
					int.TryParse(collection["Promocao.ClientesMax"], out clientesMax);

					int? realClientesMin = null;
					int? realClientesMax = null;

					if (clientesMin >= 0)
						realClientesMin = clientesMin;

					if (clientesMax >= 0)
						realClientesMax = clientesMax;

					Promocao promo = new Promocao()
					{
						IdUsuario = (int)Session["LoggedUserId"],
						DataCriado = DateTime.Now,
						DataValidadeFim = realDtFim,
						DataValidadeInicio = realDtInicio,
						EhValida = false,
						Link = collection["Promocao.Link"],
						ClientesMax = realClientesMax,
						ClientesMin = realClientesMin,
						Descricao = collection["Promocao.Descricao"]
					};

					int idPromo = _PromoRep.Add(promo);

					foreach (var item in collection.AllKeys)
					{
						int prodId = -1;
						if (int.TryParse(item, out prodId))
						{
							if (collection[item].Contains("true"))
							{
								decimal preco = -1;
								decimal.TryParse(collection["TxbPreco" + item], out preco);

								PromocaoProduto promoProd = new PromocaoProduto() { IdPromocao = idPromo, IdProduto = prodId };
								if (preco > 0)
									promoProd.Preco = preco;

								_PromoRep.AddPromocaoProduto(promoProd);
							}
						}
					}

					return RedirectToAction("Details", "Promocao", new { id = idPromo });
				}

				return RedirectToAction("LogIn", "Usuario");
			}
			else
			{
				IQueryable<Produto> produtos = _ProdRep.FindAllProdutos();

				List<Produto> produtosFiltrados = produtos.ToList();
				produtosFiltrados.Sort((a, b) => a.ToString().CompareTo(b.ToString()));
				
				if(tipoProd.Value != ETipoProduto.None)
					produtosFiltrados.RemoveAll(p => p.IdTipo != tipoProd.Value);

				return PartialView("Controls/UProductsList", produtosFiltrados.AsQueryable());
			}
        }

        //
        // GET: /Promocao/Edit/5
 
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: /Promocao/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
		[HttpPost]
		public ActionResult InserirComentario(FormCollection collection)
		{
			try
			{
				ComentariosPromocao coment = new ComentariosPromocao();
				if (Session["LoggedUserId"] != null)
				{
					int userId = (int)Session["LoggedUserId"];

					if (userId > 0)
					{
						
						coment.IdUsuario = userId;
						coment.IdPromocao = int.Parse(collection["IdPromocao"]);
						coment.Texto = collection["Texto"];
						coment.Data = DateTime.Now;

						_PromoRep.InserirComentario(coment);
					}
				}

				return RedirectToAction("Details", new { id = coment.IdPromocao });
			}
			catch
			{
				return View();
			}
		}

        //
        // GET: /Promocao/Delete/5
 
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /Promocao/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}
